package com.hcy.app.api

import android.util.Log
import com.google.gson.Gson
import com.google.gson.JsonObject
import com.google.gson.JsonParser
import okhttp3.Interceptor
import okhttp3.MediaType.Companion.toMediaTypeOrNull
import okhttp3.Response
import okhttp3.ResponseBody.Companion.toResponseBody

class InterceptorForResponse : Interceptor {

    override fun intercept(chain: Interceptor.Chain): Response {
        val originalResponse = chain.proceed(chain.request())

        // 构建新的 BaseModel 结构
        val baseJson = createMyBody(originalResponse)
        // 创建新的响应体
        val newBody = Gson().toJson(baseJson)
            .toResponseBody(originalResponse.body?.contentType() ?: "application/json".toMediaTypeOrNull())

        // 构建新响应
        return originalResponse.newBuilder()
            .code(200) // 强制改为200避免Retrofit报错
            .body(newBody)
            .header("Content-Length", newBody.contentLength().toString())
            .build()
    }
    // 对请求body的原始数据进行二次封装，将返回值强制转换为我们自己的结构体
    private fun createMyBody(originalResponse:Response): JsonObject{
        try {
            return when(originalResponse.code){
                in 200..299 ->{
                    val originalBody = originalResponse.body?.string()
                    val jsonElement = JsonParser.parseString(originalBody)
                    JsonObject().apply {
                        addProperty("stateCode", originalResponse.code)
                        addProperty("code", 0)
                        addProperty("message", "")
                        add("result", jsonElement)  // 原始数据作为 result 字段
                    }
                }
                in 400..499 -> {
                    Log.e(TAG, "intercept: HTTP 服务器异常:${originalResponse.message} ,code: ${originalResponse.code},url:${originalResponse.request.url.toUrl()}")
                    // 解析出错误码和消息
                    JsonObject().apply {
                        addProperty("stateCode", originalResponse.code)
//                    addProperty("code", jsonElement?.asJsonObject?.get("code")?.asInt)
//                    addProperty("message", jsonElement?.asJsonObject?.get("message")?.toString())
//                    add("result", jsonElement)  // 原始数据作为 result 字段
                    }
                }
                in 500..599 -> {
                    Log.e(TAG, "intercept: HTTP 服务器异常:${originalResponse.message} ,code: ${originalResponse.code},url:${originalResponse.request.url.toUrl()}")
                    val originalBody = originalResponse.body?.string()
                    val jsonElement = JsonParser.parseString(originalBody)
                    // 解析出错误码和消息
                    JsonObject().apply {
                        addProperty("stateCode", originalResponse.code)
                        if ( jsonElement.isJsonObject ){
                            addProperty("code", jsonElement.asJsonObject?.get("code")?.asInt)
                            addProperty("message", jsonElement.asJsonObject?.get("message")?.toString())
                        }
                    }
                }
                else -> {
                    Log.e(TAG, "intercept: HTTP 网络异常信息:${originalResponse.message} ,code: ${originalResponse.code},url:${originalResponse.request.url.toUrl()}")
                    JsonObject().apply {
                        addProperty("stateCode", originalResponse.code)
                        addProperty("code", 100000)
                        addProperty("message", "intercept: HTTP 网络异常信息[${originalResponse.message}]")
                    }
                }
            }
        }catch (e: Exception){
            return JsonObject().apply {
                addProperty("stateCode", originalResponse.code)
                addProperty("code", 100000)
                addProperty("message", "未知异常信息[${e.message}]")
            }
        }
    }

    companion object {
        private val TAG = this::class.simpleName
    }
}
